package ig.metrica.ui;

import ig.metrica.ui.modelo.ThreadModelos;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDesktopPane;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;


/**
 * This code was generated using CloudGarden's Jigloo
 * SWT/Swing GUI Builder, which is free for non-commercial
 * use. If Jigloo is being used commercially (ie, by a corporation,
 * company or business for any purpose whatever) then you
 * should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details.
 * Use of Jigloo implies acceptance of these licensing terms.
 * *************************************
 * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED
 * for this machine, so Jigloo or this code cannot be used legally
 * for any corporate or commercial purpose.
 * *************************************
 */
public abstract class WizzardSevinproPanel extends JPanel {
    public ThreadModelos dialogo=null;
    protected ArrayList pantallas;
    public PantallaBusquedaSevinproPanel pantallaBusqueda;
    protected boolean registroUnico = false;
    //----------------------------------
    public Object[] llaveRegistro;
    //----------------------------------
    private int pantallaActual;
    protected Object fuenteEventoAnterior;
    
    private JButton btnNuevo;
    public JButton btnEditar;
    private JButton btnEliminar;
    private JButton btnBuscar;
    private JButton btnGuardar;
    private JButton btnCancelar;
    private JButton btnSalir;
    //------------------------------
    private JPanel panelMedio;
    private JPanel panelInferior;
    //------------------------------
    private JButton btnAnterior;
    private JButton btnSiguiente;
    private JComboBox comboPantalla;
    public JFrame frame=null;
    private JToolBar panelSuperior=null;
    private boolean resizable=false;
    
    public WizzardSevinproPanel(JFrame frame){
        //Configuracion de la interfaz grafica
        String path = "./lib/images/";
        
        
        setLayout( new BorderLayout() );
        this.setPreferredSize(new java.awt.Dimension(174, 101));
        
        add( panelSuperior = new JToolBar()/*Panel*/,BorderLayout.NORTH );
        panelSuperior.setLayout( new FlowLayout( FlowLayout.LEFT ) );
        panelSuperior.setEnabled(false);
                        /*panelSuperior.setBorder(BorderFactory.createCompoundBorder(
                                        BorderFactory.createEmptyBorder(8, 0, 0, 0), BorderFactory.createEtchedBorder()));*/
        //----------------------------------
        
        
        panelSuperior.add( btnNuevo = new JButton(  new ImageIcon(getClass().getResource("/ig/util/images/"+"nuevo.gif")) ));
        panelSuperior.add( btnEditar = new JButton( new ImageIcon(getClass().getResource("/ig/util/images/"+"editar.gif")) ));
        panelSuperior.add( btnEliminar = new JButton( new ImageIcon(getClass().getResource("/ig/util/images/"+"borrar.gif")) ));
        panelSuperior.add( btnBuscar = new JButton( new ImageIcon(getClass().getResource("/ig/util/images/"+"buscar.gif")) ));
        panelSuperior.add( btnGuardar = new JButton( new ImageIcon(getClass().getResource("/ig/util/images/"+"guardar.gif")) ));
        panelSuperior.add( btnCancelar = new JButton( new ImageIcon(getClass().getResource("/ig/util/images/"+"cancelar.gif")) ));
        panelSuperior.add( btnSalir = new JButton( new ImageIcon(getClass().getResource("/ig/util/images/"+"salir.gif")) ));
        
        
//                      panelSuperior.add( btnNuevo = new JButton(  CargadorImagenes.crearIconoPath(path+"nuevo.gif")) );
//			panelSuperior.add( btnEditar = new JButton( CargadorImagenes.crearIconoPath(path+"editar.gif")) );
//			panelSuperior.add( btnEliminar = new JButton( CargadorImagenes.crearIconoPath(path+"borrar.gif")) );
//			panelSuperior.add( btnBuscar = new JButton( CargadorImagenes.crearIconoPath(path+"buscar.gif")) );
//			panelSuperior.add( btnGuardar = new JButton( CargadorImagenes.crearIconoPath(path+"guardar.gif")) );
//			panelSuperior.add( btnCancelar = new JButton( CargadorImagenes.crearIconoPath(path+"cancelar.gif")) );
//			panelSuperior.add( btnSalir = new JButton( CargadorImagenes.crearIconoPath(path+"salir.gif")) );
        
        
        //btnNuevo.setContentAreaFilled( false );
        btnNuevo.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        btnNuevo.setOpaque(false);
        btnNuevo.setToolTipText("Nuevo");
        btnNuevo.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnNuevoActionPerformed(e);}});
        //--------------------------------------
        //btnEditar.setContentAreaFilled( false );
        btnEditar.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        btnEditar.setOpaque(false);
        btnEditar.setToolTipText("Editar");
        btnEditar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnEditarActionPerformed(e);}});
        //--------------------------------------
        //btnEliminar.setContentAreaFilled( false );
        btnEliminar.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        btnEliminar.setOpaque(false);
        btnEliminar.setToolTipText("Eliminar");
        btnEliminar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnEliminarActionPerformed(e);}});
        //--------------------------------------
        //btnBuscar.setContentAreaFilled( false );
        btnBuscar.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        btnBuscar.setOpaque(false);
        btnBuscar.setToolTipText("Buscar");
        btnBuscar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnBuscarActionPerformed(e);}});
        //--------------------------------------
        //btnGuardar.setContentAreaFilled( false );
        btnGuardar.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        btnGuardar.setOpaque(false);
        btnGuardar.setToolTipText("Guardar");
        btnGuardar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnGuardarActionPerformed(e);}});
        //--------------------------------------
        //btnCancelar.setContentAreaFilled( false );
        btnCancelar.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        btnCancelar.setOpaque(false);
        btnCancelar.setToolTipText("Cancelar");
        btnCancelar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnCancelarActionPerformed(e);}});
        //--------------------------------------
        //btnSalir.setContentAreaFilled( false );
        btnSalir.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        btnSalir.setOpaque(false);
        btnSalir.setToolTipText("Salir");
        btnSalir.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnSalirActionPerformed(e);}});
        
        
        setEstadoBotonera(false, false, false, false, false, false, false);
    }
    
    protected final void setEstadoBotonera( boolean nuevo, boolean editar, boolean eliminar,
            boolean buscar, boolean guardar, boolean cancelar, boolean salir ){
        btnNuevo.setEnabled( nuevo );
        btnEditar.setEnabled( editar );
        btnEliminar.setEnabled( eliminar );
        btnBuscar.setEnabled( buscar );
        btnGuardar.setEnabled( guardar );
        btnCancelar.setEnabled( cancelar );
        btnSalir.setEnabled( salir );
    }
    
    public void setPantallasWizzard(ArrayList pantallas, PantallaBusquedaSevinproPanel pantallaBusqueda) throws Exception{
        setPantallasWizzard(pantallas, pantallaBusqueda, false);
    }
    
    public void setPantallasWizzard(ArrayList _pantallas, PantallaBusquedaSevinproPanel pantallaBusqueda, boolean registroUnico) throws Exception{
        this.pantallaBusqueda = pantallaBusqueda;
        this.registroUnico = registroUnico;
        comboPantalla = new JComboBox();
        if(panelMedio!=null)remove(panelMedio);
        if(panelInferior!=null)remove(panelInferior);
        add(panelMedio = new JPanel(), BorderLayout.CENTER );
        panelMedio.setLayout( new CardLayout() );
        panelMedio.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        //---------------------------------------------
        Iterator i = _pantallas.iterator();
        while (i.hasNext()){
            PantallaSevinproPanel pantalla = (PantallaSevinproPanel)i.next();
            //System.out.println(pantalla.getTitulo() );
            panelMedio.remove(pantalla);
            panelMedio.add( pantalla, pantalla.getTitulo() );
            comboPantalla.addItem( pantalla.getTitulo() );
            pantalla.updateUI();
        }
        panelMedio.updateUI();
        this.pantallas = _pantallas;
        
        if (this.pantallas.size()>1){
                /*
                 * Solo si el numero de pantallas es mayor a uno se despliega
                 * el panel de navegacion inferior
                 */
            add( panelInferior = new JPanel(), BorderLayout.SOUTH );
            panelInferior.setLayout( new FlowLayout( FlowLayout.RIGHT ) );
            panelInferior.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 20, 20));
            //---------------------------------------
            panelInferior.add( new JLabel("Ir a la Pagina  "));
            panelInferior.add(comboPantalla);
            panelInferior.add(new JLabel("  "));
            panelInferior.add(btnAnterior = new JButton("Anterior"));
            panelInferior.add(btnSiguiente = new JButton("Siguiente"));
            
            btnAnterior.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnAnteriorActionPerformed(e);}});
            btnSiguiente.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnSiguienteActionPerformed(e);}});
            comboPantalla.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){comboPantallaActionPerformed(e);}});
            
            pantallaActual=0;
            btnAnterior.setEnabled(false);
        }
        if (registroUnico){
            setEstado(2);
            cargarRegistro();
        }else
            setEstado(1);
        repaint();
        updateUI();
    }
    int contador=0;
    protected final void activarPantallasWizzard(boolean b){
        Iterator i = pantallas.iterator();
        try {
            while(i.hasNext())
                ((PantallaSevinproPanel)i.next()).setModificable(b);
        } catch (Exception e) {
            if(contador<4){
                System.out.print("*");
                activarPantallasWizzard(b);
                contador++;
            }else
                contador=0;
        }
    }
    
    protected final void limpiarPantallasWizzard() throws Exception{
        Iterator i = pantallas.iterator();
        while(i.hasNext())
            ((PantallaSevinproPanel)i.next()).limpiarCampos();
        
    }
    
    //  -------------------------------------------------------------------------------------------------
    
    protected final void btnAnteriorActionPerformed(ActionEvent e) {
        pantallaActual--;
        comboPantalla.setSelectedIndex(pantallaActual);
        
        //CardLayout c = (CardLayout)panelMedio.getLayout();
        //c.previous( panelMedio );
        //c.show( panelMedio, (String)comboPantalla.getSelectedItem() );
        
    }
    
    protected final void btnSiguienteActionPerformed(ActionEvent e) {
        pantallaActual++;
        comboPantalla.setSelectedIndex(pantallaActual);
        
        //CardLayout c = (CardLayout)panelMedio.getLayout();
        //c.next( panelMedio );
        //c.show( panelMedio, (String)comboPantalla.getSelectedItem() );
        
    }
    
    protected final void comboPantallaActionPerformed(ActionEvent e) {
        CardLayout c = (CardLayout)panelMedio.getLayout();
        c.show( panelMedio, (String)comboPantalla.getSelectedItem() );
        
        pantallaActual = comboPantalla.getSelectedIndex();
        if (pantallaActual == 0){
            btnAnterior.setEnabled(false);
        }else{
            btnAnterior.setEnabled(true);
        }
        
        if (pantallaActual >= pantallas.size()-1){
            btnSiguiente.setEnabled(false);
        }else{
            btnSiguiente.setEnabled(true);
        }
        
    }
    
    //----------------------------------------------------------------------------------
    public boolean activarBotones=true;
    protected final void setEstado(int i) throws Exception{
        if (i==1){
            limpiarPantallasWizzard();
            if(activarBotones)
                setEstadoBotonera(true, false, false, pantallaBusqueda!=null, false, false, true);
            activarPantallasWizzard(false);
            llaveRegistro=null;
        }else if (i==2){
            if (registroUnico){
                if(activarBotones)
                    setEstadoBotonera(false, true, false, false, false, false, true);
            }else
                if(activarBotones)
                    setEstadoBotonera(true, true, true, pantallaBusqueda!=null, false, false, true);
            activarPantallasWizzard(false);
        }else if (i==3){
            activarPantallasWizzard(true);
            if(activarBotones)
                setEstadoBotonera(false, false, false, false, true, true, true);
        }
    }
    
    
    protected final void btnNuevoActionPerformed(ActionEvent e){
        if(this.dialogo==null || !this.dialogo.isProcesando())
            try {
                nuevo();
                if (btnEditar.isEnabled()) limpiarPantallasWizzard();
                setEstado(3);
                activarPantallasWizzard(true);
                fuenteEventoAnterior = btnNuevo;
            } catch (Exception e1) {
                //JOptionPane.showInternalMessageDialog( this, e1.toString() );
                JOptionPane.showMessageDialog( this, e1.toString(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            }
    }
    
    protected final void btnEditarActionPerformed(ActionEvent e){
        if(this.dialogo==null || !this.dialogo.isProcesando())
            try {
                setEstado(3);
                activarPantallasWizzard(true);
                fuenteEventoAnterior = btnEditar;
            } catch (Exception e1) {
                JOptionPane.showMessageDialog( this, e1.toString(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            }
    }

    public String getTitle(){
        return ((JInternalFrame)this.getParent().getParent().getParent().getParent()).getTitle();
    }
    protected final void btnEliminarActionPerformed(ActionEvent e){

        if(!PrincipalMetrica.validarPermisos(this.getTitle(), PrincipalMetrica.ELIMINAR)){
            JOptionPane.showMessageDialog(this, "Usted no tiene permisos para eliminar información sobre esta opción","X",JOptionPane.WARNING_MESSAGE);
            return;
        }

        int opcion = -100;
        if(this.dialogo==null || !this.dialogo.isProcesando())
            opcion = JOptionPane.showConfirmDialog( this, " ¿ Desea realmente borrar permanentemente el registro ? ","Selecione",JOptionPane.OK_CANCEL_OPTION);
        
        if (opcion == JOptionPane.OK_OPTION){
            try {
                eliminarRegistro();
//                JOptionPane.showInternalMessageDialog( this, "Se eliminaron todos los dato relacionados con el modelo actual." );
                setEstado(1);
            } catch (Exception e1) {
                JOptionPane.showMessageDialog( this, "Error !\nProblemas al Intentar Eliminar el Registro !\n"+e1.toString() );
            }
        }
    }
    
    protected final void btnBuscarActionPerformed(ActionEvent e){
        if(this.dialogo==null || !this.dialogo.isProcesando())
            if (pantallaBusqueda!=null){
            
            if ( this.getParent().getParent().getParent().getParent().getParent() instanceof JDesktopPane ){
                /* Si el contenedor del Wizzard es un JInternalFrame */
                pantallaBusqueda.limpiarCriteriosBusqueda();
                JDialog dialodo=new JDialog(this.frame,true);
                dialodo.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                dialodo.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent evt) {
                        formWindowClosing(evt);
                    }
                });
                dialodo.setSize(500,400);
                dialodo.add(pantallaBusqueda);
                centrarDialogo(dialodo);
                dialodo.setVisible(true);
            }else {
                /* Si el contendor del Wizzard es un otro componente */
                //TODO Implementar este caso. Esto es prioridad baja.
            }
            
            }
    }
    
   
    protected final void btnGuardarActionPerformed(ActionEvent e){

        if(!PrincipalMetrica.validarPermisos(this.getTitle(), PrincipalMetrica.GUARDAR)){
            JOptionPane.showMessageDialog(this, "Usted no tiene permisos para guardar informaci�n sobre esta opci�n","X",JOptionPane.WARNING_MESSAGE);
            return;
        }

        if(this.dialogo==null || !this.dialogo.isProcesando()){
            try {
                if (fuenteEventoAnterior==btnNuevo){
                    adicionarRegistro();
//                JOptionPane.showInternalMessageDialog( this, "Registrado con exito." );
//                JOptionPane.showMessageDialog( this, "Modificado con exito.","Mensaje",JOptionPane.OK_CANCEL_OPTION );
                    setEstado(2);
                    fuenteEventoAnterior = null;
                }
            } catch (Exception e1) {
                llaveRegistro = null;
                JOptionPane.showMessageDialog( this, e1.getMessage(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
                //JOptionPane.showMessageDialog( this, e1.toString(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
                e1.printStackTrace();
            }
            
            Object[] llaveAnterior = llaveRegistro;
            try {
                if (fuenteEventoAnterior==btnEditar){
                    editarRegistro();
//				JOptionPane.showMessageDialog( this, "Los datos fueron gurdados satisfactoriamente","Mensaje",JOptionPane.OK_CANCEL_OPTION);
                    setEstado(2);
                    fuenteEventoAnterior = null;
                }
            } catch (Exception e1) {
                llaveRegistro = llaveAnterior;
                JOptionPane.showMessageDialog( this, e1.getMessage(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
                e1.printStackTrace();
            }
        }
    }
    
    protected final void btnCancelarActionPerformed(ActionEvent e){
        Object[] llaveAnterior = llaveRegistro;
        if(this.dialogo==null || !this.dialogo.isProcesando())
            try {
                if (llaveRegistro==null)
                    setEstado(1);
                else{
                    cargarRegistro();
                    setEstado(2);
                }
                fuenteEventoAnterior = null;
            } catch (Exception e1) {
                llaveRegistro=llaveAnterior;
                JOptionPane.showMessageDialog( this, e1.getMessage(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
                //JOptionPane.showMessageDialog( this, e1.toString(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            }
    }
    
    protected void btnSalirActionPerformed(ActionEvent e){
        if(this.dialogo==null || !this.dialogo.isProcesando()){
            this.salir();
            ((JInternalFrame)this.getParent().getParent().getParent().getParent()).dispose();
        }
    }


    private void formWindowClosing(java.awt.event.WindowEvent evt){
        pantallaBusqueda.salir();
    }

    private void centrarDialogo(JDialog dialodo){
        java.awt.Dimension dimensionScreen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        java.awt.Rectangle dimensionPantalla = dialodo.getBounds();
        dialodo.setLocation((dimensionScreen.width - dimensionPantalla.width) / 2, (dimensionScreen.height - dimensionPantalla.height) / 2);
    }
    
    protected final void setLlave(Object[] llaveRegistro){
        try {
            if (llaveRegistro!=null){
                this.llaveRegistro = llaveRegistro;
                cargarRegistro();
                setEstado(2);
            }else{
                if (this.llaveRegistro!=null){
                    cargarRegistro();
                    setEstado(2);
                }else{
                    setEstado(1);
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace();
            JOptionPane.showMessageDialog( this, e1.getMessage(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            //JOptionPane.showMessageDialog( this, e1.toString(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
        }
    }
    
    public final void setKey(Object[] llaveRegistro){
        try {
            if (llaveRegistro!=null){
                this.llaveRegistro = llaveRegistro;
                cargarRegistro();
                setEstado(2);
            }else{
                if (this.llaveRegistro!=null){
                    cargarRegistro();
                    setEstado(2);
                }else{
                    setEstado(1);
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace();
            //JOptionPane.showMessageDialog( this, e1.toString(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            JOptionPane.showMessageDialog( this, e1.getMessage(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
        }
    }
    
    public void setMensaje(String mensaje){
        this.dialogo.setMensaje(mensaje);
    }
    
    public void setFrame(JFrame frame) {
        this.frame = frame;
    }
    
    public Frame getFrame() {
        return this.frame;
    }
    
    //---------------------------------------------------------------------------------
    
        /*
         * En este metodo se debe dejar establecido el objecto llaveRegistro
         * con la informacion necesaria para identificar la entidad.
         */
    protected abstract void adicionarRegistro() throws Exception;
    
        /*
         * Si por algun motivo al editar el registro se llega a cambiar la
         * llave primaria del mismo, este cambio tambien debe reflejarse
         * en el objeto llaveRegistro
         */
    protected abstract void editarRegistro() throws Exception;
    
    protected abstract void eliminarRegistro() throws Exception;
    
        /*
         * Para poder realizar la carga del registro el objeto llaRegistro
         * debe estar establecido de antemano.
         */
    protected abstract void cargarRegistro() throws Exception;
    
    //protected abstract void cerrarVentana();
    
    protected abstract void salir();
    
    protected abstract void nuevo();

    public boolean isResizable() {
        return resizable;
    }

    public void setResizable(boolean resizable) {
        this.resizable = resizable;
    }

}
